#pragma once
#include <iostream>
#include <jsoncpp/json/json.h>

// 定制协议的过程，目前就是定制结构化数据的过程
// 请求格式
// 我们自己定义的协议，client && server 都必须遵守! 这就叫做自定义协议
typedef struct Request
{
    int _x;
    int _y;
    char _op;   // "+-*/%"
}request_t;

typedef struct Response
{
    int code; /// server运算完毕的计算状态: code(0:success), code(-1: div 0) ...
    int _result; // 计算结果
}response_t;

// 序列化过程
std::string serializationRequest(request_t& req)
{
    Json::Value root;
    root["datax"] = req._x;
    root["datay"] = req._y;
    root["operator"] = req._op;

    Json::FastWriter writer;
    std::string json_string = writer.write(root);
    return json_string;
}

//反序列化
void DeserializationRequest(const std::string& json_string, request_t& out)
{
    Json::Reader reader;
    Json::Value root;
    reader.parse(json_string, root);
    out._x = root["datax"].asInt();
    out._y = root["datay"].asInt();
    out._op = (char)root["operator"].asUInt();
}

std::string serializationResponse(response_t& resp)
{
    Json::Value root;
    root["code"] = resp.code;
    root["result"] = resp._result;
    Json::FastWriter writer;
    std::string json_string = writer.write(root);
    return json_string;
}

void DeserializationResponse(const std::string& json_string, response_t& out)
{
    Json::Reader reader;
    Json::Value root;
    reader.parse(json_string, root);
    out.code = root["code"].asInt();
    out._result = root["result"].asInt();
}